#include<bits/stdc++.h>
using namespace std;
typedef tuple<int,int,int,int> tpi;
inline void chmax(int &x,int y){
  if(y>x)x=y;
}
int main(){
  freopen("c.in","r",stdin);
  freopen("c.out","w",stdout);
  ios::sync_with_stdio(false);
  cin.tie(0); cout.tie(0);
  int n,m; cin>>n>>m;
  vector<tpi> t(m);
  for(int i=0;i<m;i++){
    int a,b,c,d; cin>>a>>b>>c>>d;
    t[i]=make_tuple(a,b,c,d);
  }
  unsigned w=0;
  if(max(n,m)<=1000){
    vector<int> va={1,n+1},vb={1,n+1};
    for(auto i:t){
      va.emplace_back(get<0>(i)+1);
      vb.emplace_back(get<1>(i)+1);
    }
    sort(va.begin(),va.end());
    va.erase(unique(va.begin(),va.end()),va.end());
    sort(vb.begin(),vb.end());
    vb.erase(unique(vb.begin(),vb.end()),vb.end());
    sort(t.begin(),t.end(),[&](tpi x,tpi y){
      return get<2>(x)<get<2>(y);
    });
    for(int ia=0;ia+1<va.size();ia++)
      for(int ib=0;ib+1<vb.size();ib++){
        int a=va[ia],b=vb[ib],lc=0,ld=0;
        bool f=true; unsigned q=0;
        for(int i=0;i<m&&f;i++){
          f&=get<0>(t[i])<a||get<1>(t[i])<b;
          if(get<0>(t[i])>=a||get<1>(t[i])>=b)
            chmax(lc,get<2>(t[i])),chmax(ld,get<3>(t[i]));
        }
        if(!f)continue;
        for(int c=n,p=m-1;c>lc;c--){
          while(p>=0&&get<2>(t[p])>=c){
            if(get<0>(t[p])>=a||get<1>(t[p])>=b){
              f=false; break;
            }
            chmax(ld,get<3>(t[p--]));
          }
          if(!f)break;
          q+=n-ld;
        }
        w+=q*(va[ia+1]-a)*(vb[ib+1]-b);
      }
  }
  cout<<w<<endl;
  return 0;
}